设计模式是软件设计中常见的一系列通用解决方案的描述，用于解决在设计应用程序或系统时反复出现的问题。这些模式不是具体的代码，而是一种编码和设计经验的总结。C语言作为一种广泛使用的编程语言，也可以应用各种设计模式来提高代码的可维护性、可扩展性和灵活性。以下是几种常见的设计模式及其在C语言中的应用：

1. **单例模式**：确保一个类只有一个实例，并提供一个全局访问点。
    ```c
    typedef struct {
        // 单例对象的数据成员
    } Singleton;

    Singleton* getInstance() {
        static Singleton instance;
        return &instance;
    }
    ```

2. **工厂模式**：定义一个创建对象的接口，但由子类决定实例化哪一个类。
    ```c
    typedef struct {
        // 产品类的共有数据成员
    } Product;

    typedef struct {
        Product (*create)();
    } Factory;

    Product createProduct() {
        // 返回具体产品实例
        return Product();
    }
    ```

3. **观察者模式**：定义了对象之间的一对多依赖关系，当一个对象状态改变时，所有依赖于它的对象都会得到通知并自动更新。
    ```c
    typedef void (*Observer)(void*);

    typedef struct {
        Observer update;
        void* context;
    } Subject;

    void notify(Subject* subject, int data) {
        // 通知所有观察者
        subject->update(subject->context);
    }
    ```

4. **策略模式**：定义一系列算法，将每个算法封装起来，并使它们可以互换。
    ```c
    typedef struct {
        int (*operation)(int);
    } Strategy;

    int doOperation(Strategy* strategy, int value) {
        return strategy->operation(value);
    }
    ```

5. **装饰器模式**：动态地给对象添加职责，就增加功能来说，装饰器模式相比生成子类更为灵活。
    ```c
    typedef struct Component Component;
    struct Component {
        int (*operation)(Component*);
    };

    typedef struct Decorator {
        Component base;
        Component* component;
    } Decorator;

    int operation(Decorator* decorator) {
        return decorator->component->operation(decorator->component);
    }
    ```